我們前兩天討論的 matplotlib 與 Seaborn 套件基本上已經可以滿足絕大多數的繪圖需求,唯一美中不足的一點是這些圖形都是靜態(Static)的,如果我們想要讓這些圖形帶有一點互動(Interactive),像是滑鼠游標移上去會顯示資料點的數據或可以縮放圖形等基於 JavaScript 的效果,我們可以在 Python 使用 Bokeh 這個高階繪圖套件來達成。
Bokeh is a Python interactive visualization library that targets modern web browsers for presentation. Its goal is to provide elegant, concise construction of novel graphics in the style of D3.js, and to extend this capability with high-performance interactivity over very large or streaming datasets. Bokeh can help anyone who would like to quickly and easily create interactive plots, dashboards, and data applications.
Welcome to Bokeh - Bokeh 0.12.3 documentation
以目前發展來看,資料視覺化套件會以 d3.js 與其他基於 JavaScript 或 d3.js 衍生的網頁專案領銜衝鋒,像是 Leaflet、c3.js 以及我們今天會使用的 plotly 等。Python 與 R 語言的視覺化套件則是努力讓使用者用精簡的方法與函數畫出具備互動效果的視覺化,如我們今天要討論的 Bokeh 以及 Plotly。如果你的工作是以資料視覺化為重,花時間與精神鑽研網頁前端技術與 d3.js 是必須的投資。
Visualizations built on web technologies (that is, JavaScript-based) appear to be the inevitable future.
Wes McKinney
我們今天試著使用 Bokeh 與 R 語言的 Plotly 套件來畫一些基本的圖形,包括:
我下載的 Anaconda 版本已經將 Bokeh 安裝好了,如果你的版本沒有,只要在終端機執行這段程式即可。
$ conda install -c anaconda bokeh=0.12.3
使用 bokeh.charts
的 Histogram()
方法。
from bokeh.charts import Histogram, show
import numpy as np
normal_samples = np.random.normal(size = 100000) # 生成 100000 組標準常態分配(平均值為 0,標準差為 1 的常態分配)隨機變數
hist = Histogram(normal_samples)
show(hist)
使用 ggplotly()
函數就可以將 ggplot2 套件所繪製的基本圖形轉換為 Plotly 圖形。
library(ggplot2)
library(plotly)
normal_samples <- rnorm(100000) # 生成 100000 組標準常態分配(平均值為 0,標準差為 1 的常態分配)隨機變數
normal_samples_df <- data.frame(normal_samples)
hist <- ggplot(normal_samples_df, aes(x = normal_samples)) + geom_histogram(aes(y = ..density..)) + geom_density()
ggplotly(hist)
使用 bokeh.charts
的 Scatter()
方法。
from bokeh.charts import Scatter, show
import pandas as pd
speed = [4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, 22, 23, 24, 24, 24, 24, 25]
dist = [2, 10, 4, 22, 16, 10, 18, 26, 34, 17, 28, 14, 20, 24, 28, 26, 34, 34, 46, 26, 36, 60, 80, 20, 26, 54, 32, 40, 32, 40, 50, 42, 56, 76, 84, 36, 46, 68, 32, 48, 52, 56, 64, 66, 54, 70, 92, 93, 120, 85]
cars_df = pd.DataFrame(
{"speed": speed,
"dist": dist
}
)
scatter = Scatter(cars_df, x = "speed", y = "dist")
show(scatter)
使用 ggplotly()
函數就可以將 ggplot2 套件所繪製的基本圖形轉換為 Plotly 圖形。
library(ggplot2)
library(plotly)
scatter_plot <- ggplot(cars, aes(x = speed, y = dist)) + geom_point()
ggplotly(scatter_plot)
使用 bokeh.charts
的 Line()
方法。
from bokeh.charts import Line, show
import pandas as pd
speed = [4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 20, 22, 23, 24, 24, 24, 24, 25]
dist = [2, 10, 4, 22, 16, 10, 18, 26, 34, 17, 28, 14, 20, 24, 28, 26, 34, 34, 46, 26, 36, 60, 80, 20, 26, 54, 32, 40, 32, 40, 50, 42, 56, 76, 84, 36, 46, 68, 32, 48, 52, 56, 64, 66, 54, 70, 92, 93, 120, 85]
cars_df = pd.DataFrame(
{"speed": speed,
"dist": dist
}
)
line = Line(cars_df, x = "speed", y = "dist")
show(line)
使用 ggplotly()
函數就可以將 ggplot2 套件所繪製的基本圖形轉換為 Plotly 圖形。
library(ggplot2)
library(plotly)
line <- ggplot(cars, aes(x = speed, y = dist)) + geom_line()
ggplotly(line)
使用 bokeh.charts
的 Bar()
方法。
from bokeh.charts import Bar, show
import pandas as pd
cyls = [11, 7, 14]
labels = ["4", "6", "8"]
cyl_df = pd.DataFrame({
"cyl": cyls,
"label": labels
})
bar = Bar(cyl_df, values = "cyl", label = "label")
show(bar)
使用 ggplotly()
函數就可以將 ggplot2 套件所繪製的基本圖形轉換為 Plotly 圖形。
library(ggplot2)
library(plotly)
bar <- ggplot(mtcars, aes(x = cyl)) + geom_bar()
ggplotly(bar)
使用 bokeh.charts
的 BoxPlot()
方法。
from bokeh.charts import BoxPlot, show, output_notebook
import pandas as pd
output_notebook()
mpg = [21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4, 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4, 15.8, 19.7, 15, 21.4]
cyl = [6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8, 4]
mtcars_df = pd.DataFrame({
"mpg": mpg,
"cyl": cyl
})
box = BoxPlot(mtcars_df, values = "mpg", label = "cyl")
show(box)
使用 ggplotly()
函數就可以將 ggplot2 套件所繪製的基本圖形轉換為 Plotly 圖形。
library(ggplot2)
library(plotly)
box <- ggplot(mtcars, aes(y = mpg, x = factor(cyl))) + geom_boxplot()
ggplotly(box)
第二十天我們練習使用 Python 的視覺化套件 Bokeh 繪製基本的圖形,並且在 R 語言中使用 plotly
套件的 ggplotly()
函數將 ggplot2 的圖形轉換為互動的 Plotly 圖形。
同步刊登於 Github:https://github.com/yaojenkuo/learn_python_for_a_r_user